當我們使用 let 或 const 來宣告變數時,這些變數在宣告之前就已經存在於它們所在的範疇中,但是在變數實際宣告之前的那段時間,我們是無法訪問它們的。這段時間就叫做「暫時性死區」(TDZ)。在這段時間內,如果我們嘗試訪問這些變數,會得到 ReferenceError 錯誤。
TDZ 的存在可以幫助我們避免一些不期望的行為,特別是在程式碼複雜或是變數命名重複時,可以讓我們的程式碼更加安全和可靠。
console.log(myVar); // 這裡會出錯
let myVar = 10;
console.log(myVar); // 這裡會輸出 10
在這個例子中,我們在變數 myVar 使用 let 進行宣告之前嘗試訪問它。根據 TDZ 的規則,因為變數 myVar 是用 let 宣告的,在這行宣告語句之前的所有程式碼(也就是 TDZ)中都不能訪問它。所以當我們在第一行嘗試 console.log(myVar) 時,會出現 ReferenceError。
TDZ 是為了避免在變數還未初始化時使用它。這是一種保護措施,防止我們在變數尚未正確設定之前就使用它,導致潛在的錯誤。
你可以把 TDZ 想像成變數宣告之前的一個「保護罩」。這個保護罩在變數使用 let 或 const 宣告之前存在。只有當宣告發生時,這個保護罩才會被移除,變數才可以正常使用。
在使用 var 進行變數宣告時,不存在 TDZ 的概念。var 宣告的變數會被「提升」到它所在的函式或全域範圍的頂端,而初始化則保持在原來的位置。這意味著即使在宣告 var 之前訪問該變數,也不會導致錯誤,但變數的值是 undefined。
console.log(myVar); // 這裡會輸出 undefined,而不是出錯
var myVar = 10;
console.log(myVar); // 這裡會輸出 10
這就是為什麼 let 和 const 提供了更好的變數管理方式,避免在未正確初始化變數時的使用問題。